package com.atguigu.lease.common.utils;

import com.atguigu.lease.common.handler.WorkException;
import com.atguigu.lease.common.result.ResultCodeEnum;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;

/***
 * JWT工具类
 * 生成JWT 以及解析JWT
 */
public class JwtUtil {

    //定义秘钥的Key 注意：传递的字符串的加密算法要和生成的JWT的加密算法一致
    /*
    这里详细讲一下，hmacShaKeyFor()方法，该方法需要一个byte[] bytes类型的参数，我们不能直接写明文字符串，要先将字符串用同一种加密算法加密一次，
    然后再将加密后的结果作为参数传递进去，否则会报错。
     */
    private static final Key SING_KEY = Keys.hmacShaKeyFor("e4e3795a32646b7f0befbd76929d6276ab9b9b20".getBytes());
    //定义JWT的过期时间 单位为毫秒
    private static final long TOKEN_TTL_TIME = 1000 * 60 * 60L;

    /**
     * 生成JWT  token 的方法
     *
     * @param userId
     * @param count
     * @return
     */
    public static String createJWT(Long userId, String count) {
        String token = Jwts
                .builder()
                .setSubject("lease-user-token")// 设置JWT的主题
                .claim("userId", userId)
                .claim("count", count)
                .setExpiration(new Date(System.currentTimeMillis() + JwtUtil.TOKEN_TTL_TIME))// 设置过期时间 单位为毫秒，一小时后过期
                .signWith(SING_KEY) // 设置签名密钥
                .compressWith(CompressionCodecs.GZIP) // 设置压缩方式
                .compact();
        return token;
    }

    /**
     * 解析JWT的方法
     *
     * @param token
     * @return
     */
    public static Claims parseJWT(String token) {
        try {
            //先定义一个Jws对象，用于接收解析后的数据
            Jws<Claims> claimsJws = null;
            claimsJws = Jwts
                    .parserBuilder()
                    .setSigningKey(SING_KEY)// 设置签名密钥
                    .build()
                    .parseClaimsJws(token);//解析token字符串
            return claimsJws.getBody();//拿负载数据
        } catch (ExpiredJwtException e) {
            throw new WorkException(ResultCodeEnum.TOKEN_EXPIRED);
        } catch (UnsupportedJwtException e) {
            throw new WorkException(ResultCodeEnum.TOKEN_INVALID);
        }
    }
}
